package net.sansi.v3correctserver.util;

import java.util.List;

/**
 * Created by Fang
 * create time : 2025/2/27
 * IDE : IntelliJ IDEA
 * <p>
 * 查询工具
 */

public class SearchUtil {

    /**
     * 二分查找最接近的元素
     * 必须是从小到大排序的数组
     *
     * @param arr    数组
     * @param target 目标值
     * @return 返回最接近的位置
     */
    public static int binarySearchClosestPos(double[] arr, double target) {
        int left = 0, right = arr.length, res = 0;
        while (left < right) {
            int mid = left + (right - left) / 2;
            if (arr[mid] == target) {
                return mid;
            }
            if (arr[mid] < target) {
                left = mid + 1;
            } else {
                right = mid;
            }
            double midDiff = Math.abs(arr[mid] - target);
            double resDiff = Math.abs(arr[res] - target);
            if (midDiff < resDiff) {
                res = mid;
            }
        }
        return res;
    }

    /**
     * 二分查找最接近的元素
     * 必须是从小到大排序的数组
     *
     * @param arr    数组
     * @param target 目标值
     * @return 返回最接近的位置
     */
    public static int binarySearchClosestPos(int[] arr, int target) {
        double[] doubles = new double[arr.length];
        for (int i = 0; i < arr.length; i++) doubles[i] = arr[i];
        return binarySearchClosestPos(doubles, target);
    }

    /**
     * 二分查找最接近的元素值
     * 必须是从小到大排序的数组
     *
     * @param arr    数组
     * @param target 目标
     * @return 最接近的目标
     */
    public static int binarySearchClosestValue(int[] arr, int target) {
        int pos = binarySearchClosestPos(arr, target);
        return arr[pos];
    }

    /**
     * 二分查找最接近的元素值
     * 必须是从小到大排序的数组
     *
     * @param arr    数组
     * @param target 目标
     * @return 最接近的目标
     */
    public static int binarySearchClosestValue(List<Integer> arr, int target) {
        int[] t = new int[arr.size()];
        for (int i = 0; i < arr.size(); i++) t[i] = arr.get(i);
        return binarySearchClosestValue(t, target);
    }
}
